package modelo.servicio;

import java.util.List;
import modelo.bd.dao.FlujoDAO;
import modelo.bd.excepcion.DAOException;
import modelo.dominio.Flujo;

public class Flujos {

    private static Flujos instancia;
    private FlujoDAO dao;

    private Flujos() {
        this.dao = new FlujoDAO();
    }

    public static Flujos instancia() {
        if (instancia == null) {
            instancia = new Flujos();
        }
        return instancia;
    }

    @Override
    protected Object clone() throws CloneNotSupportedException {
        return new CloneNotSupportedException("No se puede clonar Flujos.");
    }

    public void agregar(String clave, String descripcion, String descripcionCorta,
            String estatus, String comentarios, boolean validaMonto, String usuario) throws DAOException {
        Flujo flujo = new Flujo(clave.replace("'", "''"), descripcion.replace("'", "''"),
                descripcionCorta, estatus, comentarios, validaMonto);
        flujo.setEstatus("N");
        if (descripcionCorta != null) {
            flujo.setDescripcionCorta(descripcionCorta.replace("'", "''"));
        }
        if (comentarios != null) {
            flujo.setComentarios(comentarios.replace("'", "''"));
        }
        dao.add(flujo, usuario);
    }

    public void editar(String clave, String descripcion, String descripcionCorta,
            String estatus, String comentarios, boolean validaMonto, String usuario) throws DAOException {
        Flujo flujo = new Flujo(clave.replace("'", "''"), descripcion.replace("'", "''"),
                descripcionCorta, estatus, comentarios, validaMonto);
        if (descripcionCorta != null) {
            flujo.setDescripcionCorta(descripcionCorta.replace("'", "''"));
        }
        if (comentarios != null) {
            flujo.setComentarios(comentarios.replace("'", "''"));
        }
        dao.update(flujo, usuario);
        //this.editar(flujo, usuario);
    }
    
//    private void editar(Flujo flujo, String usuario) throws DAOException {
//        dao.update(flujo, usuario);
//    }

    public void eliminar(String clave) throws DAOException {
        dao.deleteWhere("fluj_clave = '" + clave.replace("'", "''") + "'");
    }

    public List<Flujo> todos() throws DAOException {
        return this.dao.selectAll();
    }

    public Flujo porClave(String clave) {
        try {
            List<Flujo> ls = dao.selectWhere("fluj_clave = '" + clave.replace("'", "''") + "'");
            return ls.get(0);
        } catch (Exception e) {
            return null;
        }
    }

    public List<Flujo> paraCrear(String usuario) throws DAOException {
        return dao.selectWhere("fluj_clave IN (SELECT pafl_fluj_clave \n"
                + "                    FROM   sil_pasos_flujo, sil_responsables_paso_flujo \n"
                + "                    WHERE  pafl_tipo_paso  = 'I' \n"
                + "                    AND    repf_es_aprobador = 'S' \n"
                + "                    AND    repf_uspe_clave = '" + usuario + "' \n"
                + "                    AND    pafl_fluj_clave = repf_fluj_clave \n"
                + "                    AND    pafl_clave      = repf_pafl_clave \n"
                + "                    AND    fluj_estatus    = 'A' \n"
                + "                    )");
    }

    public String validar(String claveFlujo, String usuario) throws DAOException {
        String error = dao.validar(claveFlujo.replace("'", "''"));
        String estatus = "";
        if (error == null) {
            estatus = "A";
        } else {
            estatus = "N";
        }
        Flujo flujo = porClave(claveFlujo);
        if (!flujo.getEstatus().equalsIgnoreCase(estatus)) {
            editar(flujo.getClave(), flujo.getDescripcion(), flujo.getDescripcionCorta(),
            estatus, flujo.getComentarios(), flujo.isValidaMonto(), usuario);
        }
        return error;
    }

    public void inactivar(String claveFlujo, String usuario) throws DAOException {
        Flujo flujo = porClave(claveFlujo);
        editar(flujo.getClave(), flujo.getDescripcion(), flujo.getDescripcionCorta(),
            "I", flujo.getComentarios(), flujo.isValidaMonto(), usuario);
    }

    public String copiar(String claveFlujo, String claveNueva, String usuario) throws DAOException {
        return dao.copiar(claveFlujo, claveNueva, usuario);
    }
}
